package com.insight.modules.system.mapper;

import com.alibaba.fastjson.JSONObject;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.insight.common.system.vo.LoginUser;
import com.insight.modules.system.entity.SysUserRole;
import com.insight.modules.system.vo.SysUserRoleVO;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * <p>
 * 用户角色表 Mapper 接口
 * </p>
 *
 * @Author scott
 * @since 2018-12-21
 */
@Component
public interface SysUserRoleMapper extends MPJBaseMapper<SysUserRole> {

    /**
     * 根据用户名查询对应的角色编码列表
     * @param username 用户名
     * @return 角色编码列表
     */
    @Select("select role_code from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_users where username=#{username}))")
    List<String> getRoleByUserName(@Param("username") String username);

    /**
     * 根据用户名查询对应的角色ID列表
     * @param username 用户名
     * @return 角色ID列表
     */
    @Select("select id from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_users where username=#{username}))")
    List<String> getRoleIdByUserName(@Param("username") String username);

    /**
     * 根据用户名查询对应的角色编码列表（同 getRoleByUserName）
     * @param username 用户名
     * @return 角色编码列表
     */
    @Select("select role_code from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_users where username=#{username}))")
    List<String> getRoleCodeByUserName(@Param("username") String username);

    /**
     * 根据角色编码查询对应的用户名列表
     * @param roleCode 角色编码
     * @return 用户名列表
     */
    @Select("select username from sys_users where id in (select user_id from sys_user_role where role_id = (select id from sys_role where role_code=#{roleCode}))")
    List<String> getUsernameByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据多个角色编码查询对应的用户名列表
     * @param roleCodes 角色编码列表
     * @return 用户名列表
     */
    List<String> getUsernameByRoleCodes(@Param("roleCodes") List<String> roleCodes);

    /**
     * 根据角色编码查询用户列表（返回 LoginUser 对象）
     * @param roleCode 角色编码
     * @return 登录用户列表
     */
    List<LoginUser> getUsersByRoleCode(@Param("roleCode") String roleCode);

    /**
     * 根据用户名查询用户对应的角色信息（包含角色编码和角色名称）
     * @param username 用户名
     * @return 角色信息列表（JSON格式，包含roleCode和roleName）
     */
    @Select("select role_code as roleCode,role_name as roleName from sys_role where id in (select role_id from sys_user_role where user_id = (select id from sys_users where username=#{username}))")
    List<JSONObject> getRoleByUsername(String username);

    /**
     * 根据用户ID查询对应的角色编码列表
     * @param userId 用户ID
     * @return 角色编码列表
     */
    @Select("select role_code from sys_role where id in (select role_id from sys_user_role where user_id = #{userId})")
    List<String> getRoleCodeByuserId(@Param("userId") String userId);

    /**
     * 根据用户ID列表查询对应的角色信息列表
     * @param userIdList 用户ID列表
     * @return 用户角色对应列表
     */
    List<SysUserRoleVO> getRoleByUserIdList(@Param("userIdList") List<String> userIdList);

    /**
     * 根据用户ID查询对应的角色编码列表
     * @param userId 用户ID
     * @return 角色编码列表
     */
    List<String> getRoleCodeByUserId(@Param("userId") String userId);
}

